\section{类型}
PHP 支持 8 种原始数据类型。

四种标量类型：
\begin{enumerate}
	\item boolean（布尔型）
	\item integer（整型）
	\item float（浮点型，也称作 double)
	\item string（字符串）
\end{enumerate}

两种复合类型：
\begin{enumerate}
	\item array（数组）
	\item object（对象）
\end{enumerate}

最后是两种特殊类型：
\begin{enumerate}
	\item resource（资源）
	\item NULL（空类型）
\end{enumerate}
\begin{myremark}{查看数据类型}
如果想查看某个表达式的值和类型，用 var\_dump() 函数。
如果只是想得到一个易读懂的类型的表达方式用于调试，用 gettype() 函数。要查看某个类型，使用 is\_type() 函数。
\end{myremark}

\subsection{布尔类型}
这是最简单的类型。boolean 表达了真值，可以为 TRUE 或 FALSE。要指定一个布尔值，使用关键字 TRUE 或 FALSE。两个都不区分大小写。

\begin{lstlisting}
<?php
$foo = True; // 将TRUE 赋值给变量 $foo
?>
\end{lstlisting}

\subsection{转换为布尔值}
要明确地将一个值转换成 boolean，用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换，因为当运算符，函数或者流程控制结构需要一个 boolean 参数时，该值会被自动转换。

当转换为 boolean 时，以下值被认为是 FALSE：

布尔值 FALSE 本身
整型值 0（零）
浮点型值 0.0（零）
空字符串，以及字符串 "0"
不包括任何元素的数组
不包括任何成员变量的对象（仅 PHP 4.0 适用）
特殊类型 NULL（包括尚未赋值的变量）
从空标记生成的 SimpleXML 对象
所有其它值都被认为是 TRUE（包括任何资源）。

\subsection{整型}
整型值可以使用十进制，十六进制，八进制或二进制表示，前面可以加上可选的符号（- 或者 +）。要使用八进制表达，数字前必须加上 0（零）。要使用十六进制表达，数字前必须加上 0x。要使用二进制表达，数字前必须加上 0b。

要明确地将一个值转换为 integer，用 (int) 或 (integer) 强制转换。不过大多数情况下都不需要强制转换，因为当运算符，函数或流程控制需要一个 integer 参数时，值会自动转换。还可以通过函数 intval() 来将一个值转换成整型。

\subsection{浮点型}
浮点型（也叫浮点数 float，双精度数 double 或实数 real）可以用以下任一语法定义：

\begin{lstlisting}
<?php
$a = 1.234;
$b = 1.2e3; //科学计数法表示
$c = 7E-10;
?>
\end{lstlisting}

\subsection{字符串}
一个字符串 string 就是由一系列的字符组成，其中每个字符等同于一个字节。一个字符串可以用 4 种方式表达：单引号、双引号、heredoc、nowdoc。

\subsubsection{单引号}
定义一个字符串的最简单的方法是用单引号把它包围起来（字符 '）。要表达一个单引号自身，需在它的前面加个反斜线来转义。在单引号字符串中的变量和特殊字符的转义序列将不会被替换。

\begin{lstlisting}
echo 'this is a simple string';
\end{lstlisting}

\subsubsection{双引号}
如果字符串是包围在双引号（\"）中， PHP 将对一些特殊的字符进行解析：

% Table generated by Excel2LaTeX from sheet 'Sheet1'
\begin{table}[htbp]
  \centering
  \caption{PHP转义字符}
    \begin{tabular}{ll}
    \toprule
    \multicolumn{1}{l}{\textbf{序列}} & \multicolumn{1}{l}{\textbf{含义}} \\
    \midrule
    \textit{\textbackslash{}n} & 换行 \\
    \textit{\textbackslash{}r} & 回车 \\
    \textit{\textbackslash{}t} & 水平制表符 \\
    \textit{\textbackslash{}v} & 垂直制表符 \\
    \textit{\textbackslash{}e} & Escape \\
    \textit{\textbackslash{}f} & 换页 \\
    \textit{\textbackslash{}\textbackslash{}} & 反斜线 \\
    \textit{\textbackslash{}\$} & 美元标记 \\
    \textit{\textbackslash{}"} & 双引号 \\
    \textit{\textbackslash{}[0-7]{1,3}} & 以八进制方式来表达的字符 \\
    \textit{\textbackslash{}x[0-9A-Fa-f]{1,2}} & 以十六进制方式来表达的字符 \\
    \bottomrule
    \end{tabular}%
  \label{tab:PHP转义字符}%
\end{table}%

\subsubsection{heredoc 句法结构}

第三种表达字符串的方法是用 heredoc 句法结构：<<<。在该运算符之后要提供一个标识符，然后换行。接下来是字符串 string 本身，最后要用前面定义的标识符作为结束标志。

结束时所引用的标识符必须在该行的第一列，而且，标识符的命名也要像其它标签一样遵守 PHP 的规则：只能包含字母、数字和下划线，并且必须以字母和下划线作为开头。

\begin{lstlisting}
<?php
$name = 'MyName';

echo <<<EOT
My name is "$name".
EOT;
\end{lstlisting}

Heredoc 结构就象双引号字符串，这就是说在 heredoc 结构中列出的转义序列还可以使用，变量将被替换。

\subsubsection{Nowdoc 结构}

就象 heredoc 结构类似于双引号字符串，Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构，但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。

一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<， 但是跟在后面的标识符要用单引号括起来，即 <<<'EOT'。Heredoc 结构的所有规则也同样适用于 nowdoc 结构，尤其是结束标识符的规则。

\begin{lstlisting}
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
\end{lstlisting}

\subsection{数组}

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。
\subsubsection{定义数组}
可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键（key） => 值（value）对。自 5.4 起可以使用短数组定义语法，用 [] 替代 array()。

\begin{lstlisting}
<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>
\end{lstlisting}
key 可以是 integer 或者 string。value 可以是任意类型。

\subsubsection{访问数组单元}

数组单元可以通过 array[key] 语法来访问，方括号和花括号可以互换使用来访问数组单元。

\begin{lstlisting}
<?php
$array = array(
	"foo" => "bar",
	42 => 24,
);
var_dump($array["foo"]);

$array[42] = 100;
var_dump($array{42});
?>
\end{lstlisting}
上述代码显示结果为：

\begin{lstlisting}
string(3) "bar" int(100)
\end{lstlisting}

\subsection{对象}
要创建一个新的对象 object，使用 new 语句实例化一个类：

\begin{lstlisting}
<?php
class foo
{
    function do_foo()
    {
        echo "Doing foo.";
    }
}

$bar = new foo;
$bar->do_foo();
?>
\end{lstlisting}

详细讨论参见类与对象章节\ref{OOP}。

\subsection{资源}
资源 resource 是一种特殊变量，保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。

\subsection{NULL}
NULL 值表示一个变量没有值。NULL 类型只有一个值，就是不区分大小写的常量 NULL。

\subsection{回调类型}
自 PHP 5.4 起可用 callable 类型指定回调类型 callback。一些函数如 call\_user\_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数，还可以是对象的方法，包括静态类方法。
